package learnkotlin

import kotlin.math.max

object KotlinDemo1 {
    @JvmStatic
    fun main(args: Array<String>) {
        println("hello kotlin")

        learnVariable()

        val s = learFunctionOrMethod("张三", 20)
        println(s)

        println(largerNum(34, 66))

//        forIn();
//        forUntil();
        forDownTo()
    }

    /**
     * 变量和函数
     * val 不可变的量  对应Java中的 final
     * var 可变的变量
     */
    private fun learnVariable() {
        //类型推导
        val a = 10
        println("a= " + a)

        //显示声明
        val b: Int = 20
        println("b= " + b)

        //kotlin 没有基本数据类型 全部使用对象数据类型 Int  Long Short

    }

    /**
     * 函数       /fun  函数名 (参数名:参数类型, 参数名,参数类型): 返回值类型{ }
     */
    private fun learFunctionOrMethod(name: String, age: Int): String {
        return name + age;
    }

    fun largerNum(num1: Int, num2: Int): Int {
        return max(num1, num2)
    }

    /**
     * 语法糖 函数中只有一行代码  return可以省略
     */
    fun largeNum2(num1: Int, num2: Int) = max(num1, num2)

    /**
     * ======================================= kotlin 逻辑控制=======================================
     * if   when(switch in java )  while  for
     */

    /**
     * if 普通用法 和Java一样
     */
    fun largerNu3(num1: Int, num2: Int): Int {
        var value = 0;
        if (num1 > num2) {
            value = num1
        } else if (num1 == num2) {
            value = num1
        } else {
            value = num2
        }
        return value
    }

    /**
     * if 有返回值  : 返回值就是每一个if条件语句 的最后一行代码的返回值
     */
    fun largerNumber4(num1: Int, num2: Int): Int {
        val value = if (num1 > num2) {
            num1
        } else if (num1 == num2) {
            num1
        } else {
            num2
        }
        return value
    }

    /**
     *  语法糖 和 if有返回值  结合使用  (if函数不止一行 但是和一行代码作用是相同的)
     */
    fun largerNumber5(num1: Int, num2: Int) = if (num1 > num2) {
        num1
    } else if (num1 == num2) {
        num1
    } else {
        num2
    }

    //when  条件语句   和Java Switch区别

    /**
     * when : 1:有返回值  2:格式 when(参数值){ 匹配值->{} 匹配值->{} }  代码只有一行{}可以省略
     */
    fun getScore(name: String) = if (name == "TOM") {
        86
    } else if (name == "JIM") {
        45
    } else {
        0
    }

    fun getScore2(name: String) = when (name) {
        "TOM" -> 86
        "JIM" -> 45
        else -> 0
    }

    /**
     * 允许传入一个任意类型的参数
     * 类型匹配 is  和 Java instanceof类似
     */
    fun checkNum(num: Number) {
        when (num) {
            is Short -> println("是short")
            is Int -> println("是Int")
            is Double -> println("是Double")
        }
    }

    /**
     * when  第二种写法
     */
    fun getScore3(name: String) = when {
        name.startsWith("Tom") -> 86
        name == "Jim" -> 45
        else -> 0
    }

    /**
     * while 和Java中一样
     */


    /**
     * for:   for-in   .. : 1..10 [1,10]   for-until: 0 until 10 [0,10)  step 跳过
     * downTo 降序
     */
    fun forIn() {
        for (i in 1..10) {
            println(i)
        }
    }


    fun forUntil() {
        for (i in 0 until 10 step 2) { //step 2  : i=i+2
            println(i)
        }
    }

    /**
     * 降序
     */
    fun forDownTo() {
        for (i in 10 downTo 1) println(i)
    }


}